home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / program / gfxstf13.lha / EGSSrc.s < prev    next >
Text File  |  1995-12-18  |  21KB  |  958 lines

  1. _LVOOpenLibrary EQU -552
  2. _LVOCloseLibrary EQU -414
  3. _LVOAllocMem EQU -198
  4. _LVOFreeMem EQU -210
  5. grd_Buffers EQU $80000001
  6. grd_Width   EQU $80000002
  7. grd_Height  EQU $80000003
  8. grd_Depth   EQU $80000004
  9. grd_PixelLayout EQU $80000005
  10. grd_ColorSpace EQU $80000006
  11.  
  12. grd_PLANAR     EQU 0
  13. grd_PLANARI    EQU 1
  14. grd_CHUNKY     EQU 2
  15. grd_HICOL15    EQU 3
  16. grd_HICOL16    EQU 4
  17. grd_TRUECOL24  EQU 5
  18. grd_TRUECOL24P EQU 6
  19. grd_TRUECOL32  EQU 7
  20. grd_GRAFFITI   EQU 8
  21. grd_TRUECOL32B EQU 9
  22.  
  23. grd_Palette    EQU 0
  24. grd_RGB        EQU 1
  25. grd_BGR        EQU 2
  26. grd_RGBPC      EQU 3
  27. grd_BGRPC      EQU 4
  28.  
  29. ;    ;  0  TrueColor  LONG   RGB   %00000000 rrrrrrrr gggggggg bbbbbbbb   grd_TRUECOL32B + grd_RGB
  30. ;    ;  1  TrueColor 3 BYTE  RGB   %rrrrrrrr gggggggg bbbbbbbb            grd_TRUECOL24 + grd_RGB
  31. ;    ;  2  TrueColor  WORD   RGB   %rrrrrggg gggbbbbb                     grd_HICOL16 + grd_RGB
  32. ;    ;  3  TrueColor  WORD   RGB   %0rrrrrgg gggbbbbb                     grd_HICOL15 + grd_RGB
  33. ;    ;  4  TrueColor  LONG   BGR   %00000000 bbbbbbbb gggggggg rrrrrrrr   grd_TRUECOL32B + grd_BGR
  34. ;    ;  5  TrueColor 3 BYTE  BGR   %bbbbbbbb gggggggg rrrrrrrr            grd_TRUECOL24 + grd_BGR
  35. ;    ;  6  TrueColor  WORD   BGR   %bbbbbggg gggrrrrr                     grd_HICOL16 + grd_BGR
  36. ;    ;  7  TrueColor  WORD   BGR   %0bbbbbgg gggrrrrr                     grd_HICOL15 + grd_BGR
  37. ;    ;  8  TrueColor  LONG   RGB   %rrrrrrrr gggggggg bbbbbbbb 00000000   grd_TRUECOL32 + grd_RGB
  38. ;    ;  9  ColorMap   BYTE   -     -                                      grd_CHUNKY + grd_Palette
  39. ;    ; 10  Graffiti   BYTE   -     - (Graffiti style chunky, very special)grd_GRAFFITI + grd_Palette
  40. ;    ; 11  TrueColor  WORD   RGB   %gggbbbbb 0rrrrrgg                     grd_HICOL15 + grd_RGBPC
  41. ;    ; 12  TrueColor  WORD   BGR   %gggrrrrr 0bbbbbgg                     grd_HICOL15 + grd_BGRPC
  42. ;    ; 13  TrueColor  WORD   RGB   %gggbbbbb rrrrrggg                     grd_HICOL16 + grd_BGR
  43. ;    ; 14  TrueColor 3 BYTE  BGR   %bbbbbbbb gggggggg rrrrrrrr            grd_TRUECOL24 + grd_BGR
  44. ;    ; 15  TrueColor  LONG   BGR   %bbbbbbbb gggggggg rrrrrrrr 00000000   grd_TRUECOL32 + grd_BGR
  45. ;    ; 16  TrueColor  LONG   RGB   %rrrrrrrr gggggggg bbbbbbbb 00000000   grd_TRUECOL32 + grd_RGB
  46. ;    ; 17  TrueColor  WORD   BGR   %gggrrrrr bbbbbggg                     grd_HICOL16 + grd_BGRPC
  47.  
  48.  
  49. CALLSYS MACRO
  50.       jsr _LVO\1(a6)
  51.      ENDM
  52.  
  53. XLIB MACRO
  54.         XREF _LVO\1
  55.         ENDM
  56.  
  57. OpenLibs:
  58.       movem.l a0-a6/d0-d7,-(sp)
  59.       move.l #0,EgsBase
  60.       lea EgsName,a1
  61.       moveq #6,d0
  62.       move.l $4,a6
  63.       CALLSYS OpenLibrary
  64.       cmp.l #0,d0
  65.       beq .Exit
  66.       move.l d0,EgsBase
  67.       move.l EgsBase,a6
  68.       CALLSYS E_LockEGSVideo
  69.       CALLSYS E_GetHardInfo
  70.       move.l d0,a3
  71.       CALLSYS E_UnlockEGSVideo
  72.       move.l #1,d0
  73.       move.l ehi_Drivers(a3),a0
  74.       lea edd_Node(a0),a0
  75.       move.l LN_SUCC(a0),a0
  76.       cmp.l #0,LN_SUCC(a0)
  77.       beq .Exit
  78.       cmp.l #1,d0
  79.       bne.s .LookRB3a
  80.       move.l LN_NAME(a0),a1
  81.       cmp.l #'PICO',(a1)
  82.       bne.s .LookRB3a
  83.       bsr .Found
  84. .LookRB3a:
  85.       cmp.l #1,d0
  86.       bne.s .LookRB3b
  87.       move.l LN_NAME(a0),a1
  88.       cmp.l #'RB3a',(a1)
  89.       bne.s .LookRB3b
  90.       bsr .Found
  91. .LookRB3b:
  92.       cmp.l #1,d0
  93.       bne.s .LookA2410
  94.       move.l LN_NAME(a0),a1
  95.       cmp.l #'RB3b',(a1)
  96.       bne.s .LookA2410
  97.       bsr .Found
  98. .LookA2410:
  99.       cmp.l #1,d0
  100.       bne.s .LookRB2a
  101.       move.l LN_NAME(a0),a1
  102.       cmp.l #'A241',(a1)
  103.       bne.s .LookRB2a
  104.       bsr .Found
  105. .LookRB2a:
  106.       cmp.l #1,d0
  107.       bne.s .LookRB2b
  108.       move.l LN_NAME(a0),a1
  109.       cmp.l #'RB2a',(a1)
  110.       bne.s .LookRB2b
  111.       bsr .Found
  112. .LookRB2b:
  113.       cmp.l #1,d0
  114.       bne.s .LookG110
  115.       move.l LN_NAME(a0),a1
  116.       cmp.l #'RB2b',(a1)
  117.       bne.s .LookG110
  118.       bsr .Found
  119. .LookG110:
  120.       cmp.l #1,d0
  121.       bne.s .LookGVP
  122.       move.l LN_NAME(a0),a1
  123.       cmp.l #'G110',(a1)
  124.       bne.s .LookGVP
  125.       bsr .Found
  126. .LookGVP:
  127.       cmp.l #1,d0
  128.       bne.s .LookLoop
  129.       move.l LN_NAME(a0),a1
  130.       cmp.l #'LEGS',(a1)
  131.       bne.s .LookLoop
  132.       bsr .Found
  133. .LookLoop:
  134.       cmp.l #0,d0
  135.       beq .QuitLoop
  136.       cmp.l #0,LN_SUCC(a0)
  137.       beq .Exit
  138.       lea edd_Node(a0),a0
  139.       move.l LN_SUCC(a0),a0
  140.       cmp.l #1,d0
  141.       bne.s .SearchRB3a
  142.       move.l LN_NAME(a0),a1
  143.       cmp.l #'PICO',(a1)
  144.       bne.s .SearchRB3a
  145.       bsr .Found
  146. .SearchRB3a:
  147.       cmp.l #1,d0
  148.       bne.s .SearchRB3b
  149.       move.l LN_NAME(a0),a1
  150.       cmp.l #'RB3a',(a1)
  151.       bne.s .SearchRB3b
  152.       bsr .Found
  153. .SearchRB3b:
  154.       cmp.l #1,d0
  155.       bne.s .SearchA2410
  156.       move.l LN_NAME(a0),a1
  157.       cmp.l #'RB3b',(a1)
  158.       bne.s .SearchA2410
  159.       bsr.s .Found
  160. .SearchA2410:
  161.       cmp.l #1,d0
  162.       bne.s .SearchRB2a
  163.       move.l LN_NAME(a0),a1
  164.       cmp.l #'A241',(a1)
  165.       bne.s .SearchRB2a
  166.       bsr .Found
  167. .SearchRB2a:
  168.       cmp.l #1,d0
  169.       bne.s .SearchRB2b
  170.       move.l LN_NAME(a0),a1
  171.       cmp.l #'RB2a',(a1)
  172.       bne.s .SearchRB2b
  173.       bsr .Found
  174. .SearchRB2b:
  175.       cmp.l #1,d0
  176.       bne.s .SearchG110
  177.       move.l LN_NAME(a0),a1
  178.       cmp.l #'RB2b',(a1)
  179.       bne.s .SearchG110
  180.       bsr .Found
  181. .SearchG110:
  182.       cmp.l #1,d0
  183.       bne.s .SearchGVP
  184.       move.l LN_NAME(a0),a1
  185.       cmp.l #'G110',(a1)
  186.       bne.s .SearchGVP
  187.       bsr.s .Found
  188. .SearchGVP:
  189.       cmp.l #1,d0
  190.       bne .LookLoop
  191.       move.l LN_NAME(a0),a1
  192.       cmp.l #'LEGS',(a1)
  193.       bne .LookLoop
  194.       bsr.s .Found
  195.       bra .LookLoop
  196. .Found:
  197.       move.l #0,d0
  198.       rts
  199. .QuitLoop:
  200.       movem.l (sp)+,a0-a6/d0-d7
  201.       move.l #1,d0
  202.       rts
  203. .Exit:
  204.       movem.l (sp)+,a0-a6/d0-d7
  205. .CloseEGS:
  206.       move.l $4,a6
  207.       move.l EgsBase,a1
  208.       CALLSYS CloseLibrary
  209.       move.l #0,d0
  210.       rts
  211. EgsBase: dc.l 0
  212. EgsName: dc.b 'egs.library',0
  213.  
  214. GetScreenmodes:
  215.       movem.l a3/a6,-(sp)
  216.       move.l EgsBase,a6
  217.       CALLSYS E_LockEGSVideo
  218.       CALLSYS E_GetHardInfo
  219.       move.l d0,a3
  220.       CALLSYS E_UnlockEGSVideo
  221.       move.l ehi_Modes(a3),d0
  222.       movem.l (sp)+,a3/a6
  223.       rts
  224.  
  225. FreeScreenmodes:
  226.       rts
  227.  
  228. CloseLibs:
  229.       cmp.l #0,EgsBase
  230.       beq .Exit
  231.       move.l $4,a6
  232. .CloseEGS:
  233.       move.l $4,a6
  234.       move.l EgsBase,a1
  235.       CALLSYS CloseLibrary
  236. .Exit:
  237.       move.l #0,d0
  238.       rts
  239.  
  240. STRUCTURE  E_ScreenMode,0
  241.  STRUCT  esm_Node,LN_SIZE ; in esmNode.ln_Name you will find the name of the Screenmode
  242.  UWORD   esm_Horiz ; Horizontal resolution
  243.  UWORD   esm_Vert ; Vertical resolution
  244.  UWORD   esm_Pad
  245.  ULONG   esm_Depths ; Color depths (this code supports 1, 8 and 24 Bit)
  246.  APTR    esm_Driver ; Some infos, that you probably not need :)
  247.  STRUCT  esm_Specs,24*4 ; More things that you probably do not need...
  248. LABEL   esm_SIZEOF
  249.  
  250. STRUCTURE RtgScreenEGS,0
  251.  APTR   rsEGS_MyScreen  ; The EGS Screen handle
  252.  ULONG  rsEGS_ActiveMap ; The Buffer number of the active Buffer
  253.  APTR   rsEGS_MapA      ; Buffer 0 E_EBitmap
  254.  APTR   rsEGS_MapB      ; Buffer 1 E_EBitmap
  255.  APTR   rsEGS_MapC      ; Buffer 2 E_EBitmap
  256.  APTR   rsEGS_FrontMap  ; Buffer address of Buffer rsEGS_ActiveMap
  257.  ULONG  rsEGS_Bytes     ; 0 = 1 Bit, 1 = 8 Bit, 4 = 24 Bit
  258.  ULONG  rsEGS_Width     ; Width of the RtgScreen for fast access on it
  259.  ULONG  rsEGS_NumBuf    ; Number of Buffers of this RtgScreens
  260.  UWORD  rsEGS_Locks     ; The Screen Lock Word
  261. LABEL rsEGS_SIZEOF
  262.  
  263. STRUCTURE ScreenQuery,0
  264.  ULONG sq_ScreenMode ; Pointer to the *NAME* of the wanted Screenmode
  265.  UWORD sq_Width      ; The Width
  266.  UWORD sq_Height     ; The Height
  267.  UWORD sq_Depth      ; The color depth
  268.  ULONG sq_Buffers    ; How many Buffers...
  269.  ULONG sq_Port       ; An eDCMP Messageport (if not used 0)
  270.  ULONG sq_EdcmpFlags ; The used Edcmp-Flags of the Screen (if no eDCMP : 0)
  271. LABEL sq_SIZEOF
  272.  
  273. CloseRtgScreen:
  274.       movem.l a2/a3/a6,-(sp)
  275.       move.l a0,a3
  276.       move.l rsEGS_ActiveMap(a0),d0
  277.       cmp.l #0,d0
  278.       beq.s .NoFlip
  279.       move.l rsEGS_MyScreen(a0),a0
  280.       move.l EgsBase,a6
  281.       CALLSYS E_WaitTOF
  282.       move.l a3,a0
  283.       move.l rsEGS_MapA(a0),a1
  284.       move.l rsEGS_MyScreen(a0),a0
  285.       CALLSYS E_FlipMap
  286. .NoFlip:
  287.       move.l EgsBase,a6
  288.       move.l rsEGS_MyScreen(a3),a0
  289.       CALLSYS E_CloseScreen
  290.       move.l rsEGS_MapB(a3),a0
  291.       cmp.l #0,a0
  292.       beq.s .NoB
  293.       CALLSYS E_DisposeBitMap
  294. .NoB:
  295.       move.l rsEGS_MapC(a3),a0
  296.       cmp.l #0,a0
  297.       beq.s .NoC
  298.       CALLSYS E_DisposeBitMap
  299. .NoC:
  300.       move.l $4,a6
  301.       move.l a3,a1
  302.       move.l #rsEGS_SIZEOF,d0
  303.       CALLSYS FreeMem
  304.       movem.l (sp)+,a2/a3/a6
  305.       rts
  306.  
  307. RtgScreenAtFront:
  308.     movem.l a4-a6,-(sp)
  309.     move.l a6,a5
  310.     move.l EgsBase(a5),a6
  311.     move.l rsEGS_MyScreen(a0),a0
  312.     move.l a0,a4
  313.     CALLSYS E_WhichMonitor
  314.     move.l d0,a0
  315.     CALLSYS E_WhichScreen
  316.     move.l #0,d1
  317.     cmp.l a4,d0
  318.     bne .Not
  319.     move.l #$ffffffff,d1
  320. .Not:
  321.     move.l d1,d0
  322.     movem.l (sp)+,a4-a6
  323.     rts
  324.  
  325. GetRtgScreenData:
  326.     movem.l a2-a6,-(sp)
  327.     move.l a1,a4
  328.     cmp.l #0,a0
  329.     beq .Exit
  330.     cmp.l #0,a1
  331.     beq .Exit
  332.     move.l a0,a3
  333.     move.l a1,a0
  334.     move.l #grd_Buffers,d0
  335.     move.l UtilityBase,a6
  336.     CALLSYS FindTagItem
  337.     cmp.l #0,d0
  338.     beq .NoBuffers
  339.     move.l rsEGS_MapB(a3),d1
  340.     cmp.l #0,d1
  341.     beq .NoB
  342.     move.l rsEGS_MapC(a3),d1
  343.     cmp.l #0,d1
  344.     beq .NoC
  345.     move.l d0,a0
  346.     move.l #3,ti_Data(a0)
  347.     bra .NoBuffers
  348. .NoC:
  349.     move.l d0,a0
  350.     move.l #2,ti_Data(a0)
  351.     bra .NoBuffers
  352. .NoB:
  353.     move.l d0,a0
  354.     move.l #1,ti_Data(a0)
  355. .NoBuffers:
  356.     move.l a4,a0
  357.     move.l #grd_Width,d0
  358.     CALLSYS FindTagItem
  359.     cmp.l #0,d0
  360.     beq .BranchMinWidth
  361.     move.l rsEGS_MyScreen(a3),a0
  362.     move.l esc_Map(a0),a0
  363.     move.l d0,a1
  364.     sub.l d0,d0
  365.     move.w ebm_Width(a0),d0
  366.     ext.l d0
  367.     move.l d0,ti_Data(a1)
  368. .BranchMinWidth:
  369.     move.l a4,a0
  370.     move.l #grd_Height,d0
  371.     CALLSYS FindTagItem
  372.     cmp.l #0,d0
  373.     beq .BranchMinHeight
  374.     move.l rsEGS_MyScreen(a3),a0
  375.     move.l esc_Map(a0),a0
  376.     move.l d0,a1
  377.     move.w ebm_Height(a0),d0
  378.     ext.l d0
  379.     move.l d0,ti_Data(a1)
  380. .BranchMinHeight:
  381.     move.l a4,a0
  382.     move.l #grd_Depth,d0
  383.     CALLSYS FindTagItem
  384.     cmp.l #0,d0
  385.     beq .BranchChunky
  386.     move.l rsEGS_MyScreen(a3),a0
  387.     move.l esc_Map(a0),a0
  388.     sub.l d1,d1
  389.     move.b ebm_Depth(a0),d1
  390.     ext.w d1
  391.     ext.l d1
  392.     move.l d0,a0
  393.     move.l d1,ti_Data(a0)
  394. .BranchChunky:
  395.     move.l a4,a0
  396.     move.l #grd_PixelLayout,d0
  397.     CALLSYS FindTagItem
  398.     cmp.l #0,d0
  399.     beq .BranchColor
  400.     sub.l d1,d1
  401.     move.l rsEGS_MyScreen(a3),a0
  402.     move.l esc_Map(a0),a0
  403.     move.b ebm_Depth(a0),d1
  404.     ext.w d1
  405.     ext.l d1
  406.     cmp.b #1,d1
  407.     beq .TheOne
  408.     cmp.b #8,d1
  409.     beq .TheEight
  410. .The24:
  411.     move.l #grd_TRUECOL32,d1
  412.     move.l d0,a0
  413.     move.l d1,ti_Data(a0)
  414.     bra .BranchColor
  415. .TheEight:
  416.     move.l #grd_CHUNKY,d1
  417.     move.l d0,a0
  418.     move.l d1,ti_Data(a0)
  419.     bra .BranchColor
  420. .TheOne:
  421.     move.l #grd_PLANAR,d1
  422.     move.l d0,a0
  423.     move.l d1,ti_Data(a0)
  424. .BranchColor:
  425.     move.l a4,a0
  426.     move.l #grd_ColorSpace,d0
  427.     CALLSYS FindTagItem
  428.     cmp.l #0,d0
  429.     beq .Exit
  430.     sub.l d1,d1
  431.     move.l rsEGS_MyScreen(a3),a0
  432.     move.l esc_Map(a0),a0
  433.     move.b ebm_Depth(a0),d1
  434.     ext.w d1
  435.     ext.l d1
  436.     cmp.b #1,d1
  437.     beq .TheOne2
  438.     cmp.b #8,d1
  439.     beq .TheEight2
  440. .The242:
  441.     move.l #grd_RGB,d1
  442.     move.l d0,a0
  443.     move.l d1,ti_Data(a0)
  444.     bra .Exit
  445. .TheEight2:
  446.     move.l #grd_Palette,d1
  447.     move.l d0,a0
  448.     move.l d1,ti_Data(a0)
  449.     bra .Exit
  450. .TheOne2:
  451.     move.l #grd_Palette,d1
  452.     move.l d0,a0
  453.     move.l d1,ti_Data(a0)
  454. .Exit:
  455.     move.l a4,a1
  456.     movem.l (sp)+,a2-a6
  457.     rts
  458.  
  459. UnlockRtgScreen:
  460.       cmp.w #0,rsEGS_Locks(a0)
  461.       beq.s .Exit
  462.       move.l rsEGS_MapA(a0),a1
  463.       sub.b #1,ebm_Lock(a1)
  464.       move.l rsEGS_MapB(a0),a1
  465.       cmp.l #0,a1
  466.       beq .NoB
  467.       sub.b #1,ebm_Lock(a1)
  468. .NoB:
  469.       move.l rsEGS_MapC(a0),a1
  470.       cmp.l #0,a1
  471.       beq .NoC
  472.       sub.b #1,ebm_Lock(a1)
  473. .NoC:
  474.       sub.w #1,rsEGS_Locks(a0)
  475. .Exit:
  476.       rts
  477.  
  478. LoadRGBRtg:
  479.     movem.l d3-d7/a2-a6,-(sp)
  480.     move.l a6,a5
  481.     cmp.l #4,rsEGS_Bytes(a0)
  482.     beq .Exit
  483.     cmp.l #0,a1
  484.     beq .Exit
  485. .NewStart:
  486.     move.l a0,a3
  487.     move.l rsEGS_Bytes(a0),d0
  488.     cmp.l #0,d0
  489.     beq .OneBit
  490.     cmp.l #1,d0
  491.     beq .OneByte
  492.     bra .Exit
  493. .OneBit:
  494.     clr.l d3
  495.     clr.l d4
  496.     move.w (a1)+,d3
  497.     move.w (a1)+,d4
  498.     cmp.l #0,d3
  499.     beq .Exit
  500.     cmp.l #3,d3
  501.     bge .Exit
  502.     cmp.l #0,d4
  503.     beq .StartZero
  504.     cmp.l #1,d4
  505.     beq .StartOne
  506.     bra .Exit
  507. .StartZero:
  508.     move.l a3,a0
  509.     move.l rsEGS_MyScreen(a0),a0
  510.     move.l #0,d0
  511.     move.l (a1)+,d1
  512.     move.l (a1)+,d2
  513.     move.l (a1)+,d3
  514.     swap d1
  515.     swap d2
  516.     swap d3
  517.     and.l #$ffff,d1
  518.     and.l #$ffff,d2
  519.     and.l #$ffff,d3
  520.     divu #257,d1
  521.     divu #257,d2
  522.     divu #257,d3
  523.     and.l #$ffff,d1
  524.     and.l #$ffff,d2
  525.     and.l #$ffff,d3
  526.     move.l a1,d7
  527.     move.l EgsBase(a5),a6
  528.     CALLSYS E_SetRGB8
  529.     move.l d7,a1
  530.     cmp.l #1,d3
  531.     beq .Exit
  532. .StartOne:
  533.     move.l a3,a0
  534.     move.l rsEGS_MyScreen(a0),a0
  535.     move.l #1,d0
  536.     move.l (a1)+,d1
  537.     move.l (a1)+,d2
  538.     move.l (a1)+,d3
  539.     swap d1
  540.     swap d2
  541.     swap d3
  542.     and.l #$ffff,d1
  543.     and.l #$ffff,d2
  544.     and.l #$ffff,d3
  545.     divu #257,d1
  546.     divu #257,d2
  547.     divu #257,d3
  548.     and.l #$ffff,d1
  549.     and.l #$ffff,d2
  550.     and.l #$ffff,d3
  551.     CALLSYS E_SetRGB8
  552.     bra .Exit
  553. .OneByte:
  554.     move.l a1,a4
  555.     clr.l d1
  556.     clr.l d0
  557.     move.w (a4)+,d1
  558.     cmp.l #0,d1
  559.     beq .Exit
  560.     cmp.l #257,d1
  561.     bge .Exit
  562.     move.w (a4)+,d0
  563.     cmp.l #256,d0
  564.     bge .Exit
  565.     move.l d1,d2
  566.     sub.l #1,d1
  567.     move.l d1,d6
  568.     move.l d0,d5
  569.     move.l EgsBase(a5),a6
  570. .Loop:
  571.     move.l (a4)+,d1
  572.     move.l (a4)+,d2
  573.     move.l (a4)+,d3
  574.     swap d1
  575.     swap d2
  576.     swap d3
  577.     and.l #$ffff,d1
  578.     and.l #$ffff,d2
  579.     and.l #$ffff,d3
  580.     divu #257,d1
  581.     divu #257,d2
  582.     divu #257,d3
  583.     and.l #$ffff,d1
  584.     and.l #$ffff,d2
  585.     and.l #$ffff,d3
  586.     move.l d5,d0
  587.     move.l a3,a0
  588.     move.l rsEGS_MyScreen(a0),a0
  589.     CALLSYS E_SetRGB8
  590.     add.l #1,d5
  591.     dbra d6,.Loop
  592.     move.w (a4),d0
  593.     move.l a4,a1
  594.     move.l a3,a0
  595.     cmp.w #0,d0
  596.     bne .NewStart
  597. .Exit:
  598.     move.l #0,d0
  599.     movem.l (sp)+,d3-d7/a2-a6
  600.     rts
  601.  
  602. OpenRtgScreen:
  603.       movem.l d2-d7/a2-a6,-(sp)
  604.       cmp.l #0,EgsBase
  605.       beq .Exit
  606.       move.l a2,a4
  607.       move.l sq_Buffers(a4),d4
  608.       cmp.l #0,d4
  609.       beq .Exit
  610.       move.l #3,d0
  611.       cmp.l d0,d4
  612.       bgt .Exit
  613. .BufferDone:
  614.       move.w sq_Depth(a4),d0
  615.       move.w sq_Width,-(sp)
  616.       move.w sq_Height,-(sp)
  617.       cmp.l #24,d0
  618.       beq .TrueColor
  619.       cmp.l #8,d0
  620.       beq .Chunky
  621.       bra .Mask
  622. .TrueColor:
  623.       move.l #E_PIXELMAP,d5
  624.       move.w #24,d6
  625.       bra.s .Continue
  626. .Chunky:
  627.       move.l #E_PIXELMAP,d5
  628.       move.w #8,d6
  629.       bra.s .Continue
  630. .Mask:
  631.       move.l #E_BITPLANEMAP,d5
  632.       move.w #1,d6
  633. .Continue:
  634.       move.l #rsEGS_SIZEOF,d0
  635.       move.l #MEMF_CLEAR,d1
  636.       move.l $4,a6
  637.       CALLSYS AllocMem
  638.       cmp.l #0,d0
  639.       beq .Error1
  640.       move.l d0,a3
  641.       move.l EgsBase,a6
  642.       move.l #ens_SIZEOF,d0
  643.       move.l #MEMF_CLEAR,d1
  644.       move.l $4,a6
  645.       CALLSYS AllocMem
  646.       cmp.l #0,d0
  647.       beq .Error3
  648.       move.l d0,a0
  649.       move.l sq_ScreenMode(a4),a1
  650.       move.l a1,ens_Mode(a0)
  651.       move.w d6,ens_Depth(a0)
  652.       move.w #0,ens_Pad_1(a0)
  653.       move.l #0,ens_Colors(a0)
  654.       move.l #0,ens_Map(a0)
  655.       move.l #0,ens_Flags(a0)
  656.       move.l #0,ens_Flags(a0)
  657.       move.l #0,ens_Mouse(a0)
  658.       move.l sq_EdcmpFlags(a4),d0
  659.       move.l d0,ens_EdcmpFlags(a0)
  660.       move.l sq_Port(a4),d0
  661.       move.l d0,ens_Port(a0)
  662.       move.l EgsBase,a6
  663.       move.l a0,d7
  664.       CALLSYS E_OpenScreen
  665.       cmp.l #0,d0
  666.       beq .Error4
  667.       move.l d0,rsEGS_MyScreen(a3)
  668.       move.l d7,a1
  669.       move.l #ens_SIZEOF,d0
  670.       move.l $4,a6
  671.       CALLSYS FreeMem
  672.       move.l #0,rsEGS_ActiveMap(a3)
  673.       cmp.l #2,d4
  674.       bge.s .DBuff
  675.       move.l #0,rsEGS_MapB(a3)
  676.       move.l #0,rsEGS_MapC(a3)
  677.       tst.l (sp)+
  678.       bra .NoDBuff
  679. .AnotherLabel:
  680.       sub.l d0,d0
  681.       sub.l d1,d1
  682.       move.w (sp)+,d1
  683.       move.w (sp)+,d0
  684.       sub.l d2,d2
  685.       move.w d6,d2
  686.       move.l d5,d3
  687.       move.l #0,d4
  688.       add.l #E_EB_DISPLAYABLE,d4
  689.       add.l #E_EB_BLITABLE,d4
  690.       add.l #E_EB_SWAPABLE,d4
  691.       add.l #E_EB_CLEARMAP,d4
  692.       move.l rsEGS_MyScreen(a3),a0
  693.       move.l esc_Map(a0),a0
  694.       move.l EgsBase,a6
  695.       CALLSYS E_AllocBitMap
  696.       cmp.l #0,d0
  697.       beq .Error5
  698.       move.l d0,rsEGS_MapC(a3)
  699.       move.l d0,a0
  700.       CALLSYS E_ClearBitMap
  701.       bra .NoDBuff
  702. .DBuff:
  703.       move.w (sp)+,d1
  704.       move.w (sp)+,d0
  705.       sub.l d2,d2
  706.       move.w d6,d2
  707.       move.l d5,d3
  708.       move.l d4,-(sp)
  709.       move.l #0,d4
  710.       add.l #E_EB_DISPLAYABLE,d4
  711.       add.l #E_EB_BLITABLE,d4
  712.       add.l #E_EB_SWAPABLE,d4
  713.       add.l #E_EB_CLEARMAP,d4
  714.       move.l rsEGS_MyScreen(a3),a0
  715.       move.l esc_Map(a0),a0
  716.       move.l EgsBase,a6
  717.       move.w d0,-(sp)
  718.       move.w d1,-(sp)
  719.       CALLSYS E_AllocBitMap
  720.       move.w (sp)+,d3
  721.       move.w (sp)+,d2
  722.       move.l (sp)+,d4
  723.       cmp.l #0,d0
  724.       beq .Error5
  725.       move.w d2,-(sp)
  726.       move.w d3,-(sp)
  727.       move.l d0,rsEGS_MapB(a3)
  728.       move.l d0,a0
  729.       CALLSYS E_ClearBitMap
  730.       cmp.l #3,d4
  731.       beq .AnotherLabel
  732.       move.l #0,rsEGS_MapC(a3)
  733.       tst.l (sp)+
  734. .NoDBuff:
  735.       move.l EgsBase,a6
  736.       move.l rsEGS_MyScreen(a3),a0
  737.       move.l esc_Map(a0),a0
  738.       move.l a0,rsEGS_MapA(a3)
  739.       move.l a0,rsEGS_FrontMap(a3)
  740.       CALLSYS E_ClearBitMap
  741.       move.l rsEGS_MapA(a3),a0
  742.       move.w ebm_Width(a0),d0
  743.       ext.l d0
  744.       move.l d0,rsEGS_Width(a3)
  745.       move.b ebm_Depth(a0),d0
  746.       move.l d5,rsEGS_Type(a3)
  747.       cmp.b #8,d0
  748.       beq.s .OneByte
  749.       cmp.b #1,d0
  750.       beq.s .OneBit
  751.       move.l #4,rsEGS_Bytes(a3)
  752.       bra.s .ALabel
  753. .OneBit:
  754.       move.l #0,rsEGS_Bytes(a3)
  755.       bra .ALabel
  756. .NoB:
  757.       move.l rsEGS_MapC(a3),d0
  758.       cmp.l #0,d0
  759.       bne .NoC
  760.       move.l #2,rsEGS_NumBuf(a3)
  761.       bra .SetLock
  762. .NoC:
  763.       move.l #3,rsEGS_NumBuf(a3)
  764.       bra .SetLock
  765. .OneByte:
  766.       move.l #1,rsEGS_Bytes(a3)
  767. .ALabel:
  768.       move.l rsEGS_MapB(a3),d0
  769.       cmp.l #0,d0
  770.       bne .NoB
  771.       move.l #1,rsEGS_NumBuf(a3)
  772. .SetLock:
  773.       move.w #0,rsEGS_Locks(a3)
  774.       move.l a3,d0
  775.       movem.l (sp)+,d2-d7/a2-a6
  776.       rts
  777. .Exit:
  778.       move.l #0,d0
  779.       movem.l (sp)+,d2-d7/a2-a6
  780.       rts
  781. .Error1:
  782.       tst.l (sp)+
  783. .Raus:
  784.       movem.l (sp)+,d2-d7/a2-a6
  785.       move.l #0,d0
  786.       rts
  787. .Error3:
  788.       tst.l (sp)+
  789.       move.l a3,a1
  790.       move.l #rsEGS_SIZEOF,d0
  791.       CALLSYS FreeMem
  792.       move.l (sp)+,a0
  793.       move.l EgsBase,a6
  794.       CALLSYS E_DisposeBitMap
  795.       movem.l (sp)+,d2-d7/a2-a6
  796.       move.l #0,d0
  797.       rts
  798.  
  799. .Error4:
  800.       tst.l (sp)+
  801.       move.l ens_Map(a4),a0
  802.       move.l EgsBase,a6
  803.       CALLSYS E_DisposeBitMap
  804.       move.l a4,a1
  805.       move.l #ens_SIZEOF,d0
  806.       move.l $4,a6
  807.       CALLSYS FreeMem
  808.       move.l a3,a1
  809.       move.l #rsEGS_SIZEOF,d0
  810.       CALLSYS FreeMem
  811.       movem.l (sp)+,d2-d7/a2-a6
  812.       move.l #0,d0
  813.       rts
  814.  
  815. .Error5:
  816.       move.l rsEGS_MyScreen(a3),a0
  817.       CALLSYS E_CloseScreen
  818.       move.l rsEGS_MapC(a3),a0
  819.       cmp.l #0,a0
  820.       beq .Error6
  821.       CALLSYS E_DisposeBitMap
  822. .Error6:
  823.       move.l a3,a1
  824.       move.l #rsEGS_SIZEOF,d0
  825.       move.l $4,a6
  826.       CALLSYS FreeMem
  827.       movem.l (sp)+,d2-d7/a2-a6
  828.       move.l #0,d0
  829.       rts
  830. .Error2:
  831.       tst.l (sp)+
  832.       tst.l (sp)+
  833.       move.l a3,a1
  834.       move.l #rsEGS_SIZEOF,d0
  835.       CALLSYS FreeMem
  836.       movem.l (sp)+,d2-d7/a2-a6
  837.       move.l #0,d0
  838.       rts
  839.  
  840. SwitchScreens:
  841.       movem.l a2/a3/a6/d7,-(sp)
  842.       cmp.l rsEGS_ActiveMap(a0),d0
  843.       beq .Exit
  844.       move.l rsEGS_NumBuf(a0),d1
  845.       cmp.l d1,d0
  846.       bge .Exit
  847.       cmp.l #0,d0
  848.       beq.s .BufferOK
  849.       cmp.l #1,d0
  850.       beq.s .BufferOK
  851.       cmp.l #2,d0
  852.       bne .Exit
  853. .BufferOK:
  854.       move.l a0,a3
  855.       move.l EgsBase,a6
  856.       move.l rsEGS_MyScreen(a3),a0
  857.       cmp.l #0,d0
  858.       bne.s .NotA
  859.       move.l rsEGS_MapA(a3),a1
  860.       bra .NotC
  861. .NotA:
  862.       cmp.l #1,d0
  863.       bne.s .NotB
  864.       move.l rsEGS_MapB(a3),a1
  865.       bra .NotC
  866. .NotB:
  867.       move.l rsEGS_MapC(a3),a1
  868. .NotC:
  869.       move.l d0,d7
  870.       move.l a1,rsEGS_FrontMap(a3)
  871.       CALLSYS E_FlipMap
  872.       move.l d7,rsEGS_ActiveMap(a3)
  873. .Exit:
  874.       movem.l (sp)+,a2/a3/a6/d7
  875.       rts
  876.  
  877. GetBufAdr:
  878.       cmp.l #0,d0
  879.       beq.s .MapA
  880.       cmp.l #1,d0
  881.       beq.s .MapB
  882.       move.l rsEGS_MapC(a0),a0
  883.       bra .FindPlane
  884. .MapA:
  885.       move.l rsEGS_MapA(a0),a0
  886.       bra .FindPlane
  887. .MapB:
  888.       move.l rsEGS_MapB(a0),a0
  889. .FindPlane:
  890.       move.l ebm_Plane(a0),d0
  891.       rts
  892.  
  893. LockRtgScreen:
  894.       movem.l a4/a6,-(sp)
  895.       move.l rsEGS_MapA(a0),a1
  896.       add.b #1,ebm_Lock(a1)
  897.       add.w #1,rsEGS_Locks(a0)
  898.       move.l rsEGS_MapB(a0),a1
  899.       cmp.l #0,a1
  900.       beq.s .NoB
  901.       add.b #1,ebm_Lock(a1)
  902. .NoB:
  903.       move.l rsEGS_MapC(a0),a1
  904.       cmp.l #0,a1
  905.       beq.s .NoC
  906.       add.b #1,ebm_Lock(a1)
  907. .NoC:
  908.       move.l a0,a4
  909.       move.l DosBase,a6
  910.       move.l #5,d1
  911.       jsr -198(a6)
  912.       move.l a4,a0
  913.       movem.l (sp)+,a4/a6
  914.       move.l rsEGS_MapA(a0),a0
  915.       move.l ebm_Plane(a0),d0
  916.       rts
  917.  
  918. BlitRtg:
  919.     movem.l d6/a3/a6,-(sp)
  920.     move.l a0,a3
  921.     move.l rsEGS_MyScreen(a0),a1
  922.     movem.l d2/d3,-(sp)
  923.     move.l d4,d2
  924.     move.l d5,d3
  925.     movem.l (sp)+,d4/d5
  926.     cmp.l #0,d6
  927.     beq .Buffer0Src
  928.     cmp.l #1,d6
  929.     beq .Buffer1Src
  930.     bra .Buffer2Src
  931. .Buffer0Src:
  932.     move.l rsEGS_MapA(a3),a0
  933.     bra .Weiter
  934. .Buffer1Src:
  935.     move.l rsEGS_MapB(a3),a0
  936.     bra .Weiter
  937. .Buffer2Src:
  938.     move.l rsEGS_MapC(a3),a0
  939. .Weiter:
  940.     move.l #0,d6
  941.     cmp.l #0,d7
  942.     beq .Buffer0Dest
  943.     cmp.l #1,d7
  944.     beq .Buffer1Dest
  945.     bra .Buffer2Dest
  946. .Buffer0Dest:
  947.     move.l rsEGS_MapA(a3),a1
  948.     bra .WeiterD
  949. .Buffer1Dest:
  950.     move.l rsEGS_MapB(a3),a1
  951.     bra .WeiterD
  952. .Buffer2Dest:
  953.     move.l rsEGS_MapC(a3),d1
  954.     move.l EgsBlitBase,a6
  955.     CALLSYS EB_CopyBitMap
  956.     movem.l (sp)+,d6/a3/a6
  957.     rts
  958.